package com.gsk.europepharma.salesReport.struts.actions;

import java.security.Principal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONObject;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.Query;
import org.hibernate.Session;

import com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmMix;
import com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPdt;
import com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn;
import com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmRgpt;
import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRAdmPdtDAO;

public class SaveProduit extends Action {
	
	public static final Integer FIRST_RGPT_CREATED_FAKE_ID = 987654321;
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		HashMap<String, String> hm = new HashMap<String, String>();
        
        try {
			// VARIABLES
			HttpSession sessionObject = request.getSession();
			Principal user = request.getUserPrincipal();
			tbSpBoSRAdmPdtDAO admPdtDao;
			Session session;
			Query req;
			ArrayList result;
			Iterator iter;
			
			// MAP CORRESPONDANCE 
			Map<Integer, Integer> mapFakeIdRealIdRgpt = new HashMap<Integer, Integer>();
			
			// IDS PRESENTATION A DETRUIRE
			List<Integer> listPrstnId = new ArrayList<Integer>();
			
			// PRODUIT 
			String libelleMarche = request.getParameter("libelleMarche");
			String libelleProduit = request.getParameter("libelleProduit");
			String csSrc = request.getParameter("csSrc");
			String codeData = request.getParameter("codeData");
			String libData = request.getParameter("libData");
			String csProduct = request.getParameter("csProduct");
			System.out.println("LIBELLE MARCHE : " + libelleMarche);
			System.out.println("LIBELLE PRODUIT : " + libelleProduit);
			System.out.println("CODE SRC : " + csSrc);
			System.out.println("UNITE : " + codeData);
			System.out.println("LIBELLE UNITE : " + libData);
			System.out.println("PRODUIT SAMPILOT : " + csProduct);
			System.out.println();
			
			// INDICATEURS
			String indicateurs = request.getParameter("indicateurs");
			String tabIndicateurs[] = indicateurs.split(":");
			String indPm = (Boolean.parseBoolean(tabIndicateurs[0]) ? "Y" : "N");
			String indDpm = (Boolean.parseBoolean(tabIndicateurs[1]) ? "Y" : "N");
			String indVol = "Y";
			String indDvol = (Boolean.parseBoolean(tabIndicateurs[3]) ? "Y" : "N");
			String indEvolVol = (Boolean.parseBoolean(tabIndicateurs[4]) ? "Y" : "N");
			
			
			// PRODUIT : ID
			int cs_adm_pdt = Integer.parseInt(sessionObject.getAttribute("cs_adm_pdt").toString());
			
			if (cs_adm_pdt == 0) {
				// INSERT PRODUIT 
				admPdtDao = new tbSpBoSRAdmPdtDAO();
				session = admPdtDao.getSession();
				req = session.getNamedQuery(tbSpBoSRAdmPdtDAO.QUERY_SEQ_PDT);
				result = new ArrayList(req.list());
				cs_adm_pdt = Integer.parseInt(result.get(0).toString()); // Nouvel id (from dual)
				tbSpBoSRAdmPdt tbSpBoSRAdmPdt = new tbSpBoSRAdmPdt();
				tbSpBoSRAdmPdt.setcsAdmPdt(cs_adm_pdt);
				tbSpBoSRAdmPdt.setlibMarche(libelleMarche);
				tbSpBoSRAdmPdt.setlibPdt(libelleProduit);
				tbSpBoSRAdmPdt.setOrigineCumulee("");
				tbSpBoSRAdmPdt.setLibOrigine(null);  
				tbSpBoSRAdmPdt.setCsSrc(Integer.parseInt(csSrc));
				tbSpBoSRAdmPdt.setCodeData(codeData);
				tbSpBoSRAdmPdt.setLibData(libData); 
				tbSpBoSRAdmPdt.setMajUser(user.getName().toString());
				tbSpBoSRAdmPdt.setDateMaj(new Date());
				tbSpBoSRAdmPdt.setMultiSource("N"); 
				tbSpBoSRAdmPdt.setCsProduct(Integer.parseInt(csProduct));
				tbSpBoSRAdmPdt.setIndPm(indPm);
				tbSpBoSRAdmPdt.setIndDpm(indDpm);
				tbSpBoSRAdmPdt.setIndVol(indVol);
				tbSpBoSRAdmPdt.setIndDvol(indDvol);
				tbSpBoSRAdmPdt.setIndEvolVol(indEvolVol);
				// Sauvegarde en base
				session.save(tbSpBoSRAdmPdt);
				session.flush();
				// Mise en session 
				sessionObject.setAttribute("cs_adm_pdt", cs_adm_pdt); 
			} else {
				// UPDATE PRODUIT 
				admPdtDao = new tbSpBoSRAdmPdtDAO();
				session = admPdtDao.getSession();
				tbSpBoSRAdmPdt tbSpBoSRAdmPdt = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPdt) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPdt.class, cs_adm_pdt);
				tbSpBoSRAdmPdt.setlibMarche(libelleMarche);
				tbSpBoSRAdmPdt.setlibPdt(libelleProduit);
				tbSpBoSRAdmPdt.setCsSrc(Integer.parseInt(csSrc));
				tbSpBoSRAdmPdt.setCodeData(codeData);
				tbSpBoSRAdmPdt.setLibData(libData); 
				tbSpBoSRAdmPdt.setMajUser(user.getName().toString());
				tbSpBoSRAdmPdt.setDateMaj(new Date());
				tbSpBoSRAdmPdt.setCsProduct(Integer.parseInt(csProduct));
				tbSpBoSRAdmPdt.setIndPm(indPm);
				tbSpBoSRAdmPdt.setIndDpm(indDpm);
				tbSpBoSRAdmPdt.setIndVol(indVol);
				tbSpBoSRAdmPdt.setIndDvol(indDvol);
				tbSpBoSRAdmPdt.setIndEvolVol(indEvolVol);
				// Sauvegarde en base
				session.update(tbSpBoSRAdmPdt);
				session.flush();
			}
			
			String regroupements = request.getParameter("regroupements");
			String tabRgpt[] = regroupements.split(";");
			for (String rgpt : tabRgpt) {
				if (!rgpt.equals("")) {
					
					// REGROUPEMENT 
					String rgptAttributs[] = rgpt.split("#");
					
					System.out.println("ID      : " + rgptAttributs[0]);
					System.out.println("LIBELLE : " + rgptAttributs[1]);
					System.out.println("TYPE    : " + rgptAttributs[2]);
					System.out.println("COULEUR : " + rgptAttributs[3]);
					System.out.println("DELETE  : " + rgptAttributs[4]);
					
					// ATTRIBUTS DU REGROUPEMENT
					Integer cs_adm_rgpt = Integer.parseInt(rgptAttributs[0].toString());
					String rgptLib = rgptAttributs[1].toString();
					String typeRgpt = rgptAttributs[2].toString();
					String codeCouleur = rgptAttributs[3].toString(); 
					Boolean deleteRgpt = Boolean.parseBoolean(rgptAttributs[4]);
					
					admPdtDao = new tbSpBoSRAdmPdtDAO();
					session = admPdtDao.getSession();
					
					if (cs_adm_rgpt >= FIRST_RGPT_CREATED_FAKE_ID && !deleteRgpt) {
						// INSERT REGROUPEMENT 
						Integer fake_cs_adm_rgpt = cs_adm_rgpt;
						req = session.getNamedQuery(tbSpBoSRAdmPdtDAO.QUERY_SEQ_RGPT);
						result = new ArrayList(req.list());
						cs_adm_rgpt = Integer.parseInt(result.get(0).toString()); // Nouvel id (from dual)
						mapFakeIdRealIdRgpt.put(fake_cs_adm_rgpt, cs_adm_rgpt);
						admPdtDao = new tbSpBoSRAdmPdtDAO();
						session = admPdtDao.getSession();
						tbSpBoSRAdmRgpt tbSpBoSRAdmRgpt = new tbSpBoSRAdmRgpt();
						tbSpBoSRAdmRgpt.setcsAdmRgpt(cs_adm_rgpt);
						tbSpBoSRAdmRgpt.setcsAdmPdt(cs_adm_pdt);
						tbSpBoSRAdmRgpt.setRgpt(rgptLib);
						tbSpBoSRAdmRgpt.setTypeRgpt(typeRgpt);
						tbSpBoSRAdmRgpt.setOrigineCumulee("");
						tbSpBoSRAdmRgpt.setCodeCouleur(codeCouleur);
						tbSpBoSRAdmRgpt.setMajUser(user.getName().toString());
						tbSpBoSRAdmRgpt.setDateMaj(new Date());
						// Sauvegarde en base
						session.save(tbSpBoSRAdmRgpt);
						session.flush();
					} else if (cs_adm_rgpt < FIRST_RGPT_CREATED_FAKE_ID && !deleteRgpt) {
						// UPDATE REGROUPEMENT 
						tbSpBoSRAdmRgpt tbSpBoSRAdmRgpt = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmRgpt) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmRgpt.class, cs_adm_rgpt);
						tbSpBoSRAdmRgpt.setRgpt(rgptLib);
						tbSpBoSRAdmRgpt.setTypeRgpt(typeRgpt);
						tbSpBoSRAdmRgpt.setOrigineCumulee("");
						tbSpBoSRAdmRgpt.setCodeCouleur(codeCouleur);
						tbSpBoSRAdmRgpt.setMajUser(user.getName().toString());
						tbSpBoSRAdmRgpt.setDateMaj(new Date());
						// Sauvegarde en base
						session.update(tbSpBoSRAdmRgpt);
						session.flush();
					} else  if (cs_adm_rgpt < FIRST_RGPT_CREATED_FAKE_ID && deleteRgpt) {
						// DELETE PRESENTATIONS ASSOCIEES AU REGROUPEMENT 
						admPdtDao = new tbSpBoSRAdmPdtDAO();
						session = admPdtDao.getSession();
						req = session.getNamedQuery(admPdtDao.QUERY_LISTE_PRESENTATIONS_PAR_PRODUIT_REGROUPEMENT);
						req.setInteger("cs_adm_pdt", cs_adm_pdt);
						req.setInteger("cs_adm_rgpt", cs_adm_rgpt);
						result = new ArrayList(req.list());
						iter = result.iterator();
						// IDS PRESENTATION A DETRUIRE
						List<Integer> listPrstnIdLocal = new ArrayList<Integer>();
						// Liste des id des presentations à supprimer 
						while (iter.hasNext()) {
							Object tmp = iter.next();
							listPrstnId.add(Integer.parseInt(tmp.toString()));
							listPrstnIdLocal.add(Integer.parseInt(tmp.toString()));
						}
						// Suppression des presentations 
						for (Integer idPrstn : listPrstnIdLocal) {
							tbSpBoSRAdmPrstn tbSpBoSRAdmPrstn = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn.class, idPrstn);
							session.delete(tbSpBoSRAdmPrstn);
							session.flush();
						}
						// DELETE REGROUPEMENT 
						tbSpBoSRAdmRgpt tbSpBoSRAdmRgpt = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmRgpt) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmRgpt.class, cs_adm_rgpt);
						// Destruction en base
						session.delete(tbSpBoSRAdmRgpt);
						session.flush();
					}
					
					System.out.println();
					
				}
			}
			
			String presentations = request.getParameter("presentations");
			String tabPresentation[] = presentations.split("!");
			for (String pres : tabPresentation) {
				if (!pres.equals("")) {
					
					// PRESENTATION
					
					String presentationAttributs[] = pres.split(":");
					
					// Champs de la presentation 
					Integer cs_adm_prstn = Integer.parseInt(presentationAttributs[0].toString());
					Integer cs_adm_rgpt = Integer.parseInt(presentationAttributs[1].toString());
					if (cs_adm_rgpt >= FIRST_RGPT_CREATED_FAKE_ID) {
						cs_adm_rgpt = mapFakeIdRealIdRgpt.get(cs_adm_rgpt);
					}
					String origine = presentationAttributs[2].toString();
					String marche = presentationAttributs[3].toString();
					Integer cs_prod_hier = Integer.parseInt(presentationAttributs[4].toString());
					Integer cs_presentation = Integer.parseInt(presentationAttributs[5].toString());
					String presentation = presentationAttributs[6].toString();
					String cip = "";
					if (presentationAttributs[7] != null) {
						cip = presentationAttributs[7].toString();
					}
					Boolean affect = Boolean.parseBoolean(presentationAttributs[8].toString());
					
					// Gestion en BDD 
					if (cs_adm_prstn == 0) {
						
						if (affect) {
							// INSERT PRESENTATION 
							req = session.getNamedQuery(tbSpBoSRAdmPdtDAO.QUERY_SEQ_PRSTN);
							result = new ArrayList(req.list());
							cs_adm_prstn = Integer.parseInt(result.get(0).toString()); // Nouvel id (from dual)
							tbSpBoSRAdmPrstn tbSpBoSRAdmPrstn = new tbSpBoSRAdmPrstn();
							System.out.println("===> Insertion de la presentation : cs_adm_prstn=" + cs_adm_prstn);
							tbSpBoSRAdmPrstn.setcsAdmPrstn(cs_adm_prstn);
							tbSpBoSRAdmPrstn.setcsAdmRgpt(cs_adm_rgpt);
							tbSpBoSRAdmPrstn.setcsAdmPdt(cs_adm_pdt);
							tbSpBoSRAdmPrstn.setCsPresentation(cs_presentation); 
							tbSpBoSRAdmPrstn.setPresentation(presentation);
							tbSpBoSRAdmPrstn.setCodeCip(cip);  
							tbSpBoSRAdmPrstn.setMarche(marche);
							tbSpBoSRAdmPrstn.setOrigine(origine);
							tbSpBoSRAdmPrstn.setCodeCouleur(null);
							tbSpBoSRAdmPrstn.setFlagAffich("Y");
							tbSpBoSRAdmPrstn.setMajUser(user.getName().toString());
							tbSpBoSRAdmPrstn.setDateMaj(new Date());
							tbSpBoSRAdmPrstn.setCsProdHier(cs_prod_hier);
							// Insert en base
							session.save(tbSpBoSRAdmPrstn);
							session.flush();
						} else {
							// Rien à faire
						}
						
					} else {
						
						if (affect) {
							// UPDATE PRESENTATION 
							tbSpBoSRAdmPrstn tbSpBoSRAdmPrstn = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn.class, cs_adm_prstn);
							tbSpBoSRAdmPrstn.setcsAdmRgpt(cs_adm_rgpt);
							tbSpBoSRAdmPrstn.setcsAdmPdt(cs_adm_pdt);
							tbSpBoSRAdmPrstn.setCsPresentation(cs_presentation); 
							tbSpBoSRAdmPrstn.setPresentation(presentation);
							tbSpBoSRAdmPrstn.setCodeCip(cip);  
							tbSpBoSRAdmPrstn.setMarche(marche);
							tbSpBoSRAdmPrstn.setOrigine(origine);
							tbSpBoSRAdmPrstn.setCodeCouleur(null);
							tbSpBoSRAdmPrstn.setFlagAffich("Y");
							tbSpBoSRAdmPrstn.setMajUser(user.getName().toString());
							tbSpBoSRAdmPrstn.setDateMaj(new Date());
							tbSpBoSRAdmPrstn.setCsProdHier(cs_prod_hier);
							// Update en base
							session.update(tbSpBoSRAdmPrstn);
							session.flush();
						} else {
							// DELETE PRESENTATION
							if (!listPrstnId.contains(cs_adm_prstn)) { // On vérifie si la présentation a deja été détruite par la suppression d'un regroupement
								tbSpBoSRAdmPrstn tbSpBoSRAdmPrstn = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmPrstn.class, cs_adm_prstn);
								System.out.println("===> Suppression de la presentation : cs_adm_prstn=" + cs_adm_prstn);
								// Delete en base
								session.delete(tbSpBoSRAdmPrstn);
								session.flush();
							}
						}
						
					}
					
				}
			}
			
			// SUPPRESSION DES MIX POUR LE PRODUIT
			admPdtDao = new tbSpBoSRAdmPdtDAO();
			session = admPdtDao.getSession();
			req = session.getNamedQuery(admPdtDao.QUERY_LISTE_MIX_PAR_PRODUIT);
			req.setInteger("cs_adm_pdt", cs_adm_pdt);
			result = new ArrayList(req.list());
			iter = result.iterator();
			// Mix à détruire
			List<tbSpBoSRAdmMix> listTbSpBoSRAdmMix = new ArrayList<tbSpBoSRAdmMix>();
			while (iter.hasNext()) {
				Object[] tmp = (Object[]) iter.next();
				tbSpBoSRAdmMix tbSpBoSRAdmMix = new tbSpBoSRAdmMix(Integer.parseInt(tmp[0].toString()), Integer.parseInt(tmp[1].toString()), Integer.parseInt(tmp[2].toString()));
				listTbSpBoSRAdmMix.add(tbSpBoSRAdmMix);
			}
			for (tbSpBoSRAdmMix mix : listTbSpBoSRAdmMix) {
				tbSpBoSRAdmMix tbSpBoSRAdmMix = (com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmMix) session.load(com.gsk.europepharma.salesReport.hibernate.tbSpBoSRAdmMix.class, mix);
				// Delete en base
				session.delete(tbSpBoSRAdmMix);
				session.flush();
			}
			
			// DIVISIONS 
			String divisions = request.getParameter("divisions");
			String tabDivision[] = divisions.split("!");
			for (String div : tabDivision) {
				if (!div.equals("")) {
					
					// DIVISION 
					
					String divisionAttributs[] = div.split(":");
					
					// Champs de la division 
					Integer cs_network = Integer.parseInt(divisionAttributs[0].toString());
					String reseau = divisionAttributs[1].toString();
					Integer cs_division = Integer.parseInt(divisionAttributs[2].toString());
					String division = divisionAttributs[3].toString();
					Integer cs_brand = Integer.parseInt(divisionAttributs[4].toString());
					String brand = divisionAttributs[5].toString();
					Integer cs_target = 0;
					if (divisionAttributs[6] != null && !divisionAttributs[6].toString().equals("")) {
						cs_target = Integer.parseInt(divisionAttributs[6].toString());
					}
					String target = divisionAttributs[7].toString();
					Boolean checked = Boolean.parseBoolean(divisionAttributs[8].toString());
					
					if (checked) {
						tbSpBoSRAdmMix tbSpBoSRAdmMix = new tbSpBoSRAdmMix(cs_network, cs_division, cs_adm_pdt);
						tbSpBoSRAdmMix.setBrand(brand);
						tbSpBoSRAdmMix.setCsBrand(cs_brand);
						tbSpBoSRAdmMix.setCsTarget(cs_target);
						tbSpBoSRAdmMix.setDateMaj(new Date());
						tbSpBoSRAdmMix.setMajUser(user.getName().toString());
						tbSpBoSRAdmMix.setTarget(target);
						// Insert en base
						session.save(tbSpBoSRAdmMix);
						session.flush();
					}
					
				}
			}
			
			hm.put("success", "success");
        } catch (Exception e) {
    		hm.put("success", "error");
		}
		
		JSONObject json = JSONObject.fromObject(hm);
		response.addHeader("Content-Type", "application/json");
        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
        response.getOutputStream().flush();
        return null;
	}

}
